package com.leyou.item.comtroller;

import com.leyou.common.pojo.PageResult;
import com.leyou.item.dto.SpuDTO;
import com.leyou.item.entity.Sku;
import com.leyou.item.entity.SpuDetail;
import com.leyou.item.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.persistence.TableGenerator;
import javax.xml.ws.Response;
import java.util.List;
import java.util.Map;

/**
 * @author LT
 * @version 1.0.0
 * @ClassName GoodsController.java
 * @Description TODO 商品的控制层
 * @createTime 2020年05月06日 23:36:00
 */

@RestController
public class GoodsController {

    @Autowired
    private GoodsService goodsService;

    /**
     * 查询商品spu信息，分页查询
     *
     * @param page
     * @param rows
     * @param key
     * @param saleable
     * @return
     */
    @GetMapping("/spu/page")   // get请求 /spu/page
    public ResponseEntity<PageResult<SpuDTO>> findSpuByPage(
            @RequestParam(value = "page", defaultValue = "1") Integer page,
            @RequestParam(value = "rows", defaultValue = "5") Integer rows,
            @RequestParam(value = "key", required = false) String key,
            @RequestParam(value = "saleable", required = false) Boolean saleable
    ) {
        // 返回值：PageResult<SpuDTO>
        PageResult<SpuDTO> pageResult = goodsService.findSpuByPage(page, rows, key, saleable);
        return ResponseEntity.ok(pageResult);
    }

    /**
     * 保存商品
     *
     * @param spuDTO
     * @return
     */
    // Post请求 /goods
    @PostMapping("/goods")
    // 公共 响应实体类<无返回值> saveGoods(@请求正文 SpuDTO spuDTO)
    public ResponseEntity<Void> saveGoods(@RequestBody SpuDTO spuDTO) {
        // goods业务类.创建商品接口(spuDTO)
        goodsService.saveGoods(spuDTO);
        // 返回 响应实体类.状态(Http状态.已创建).建立();
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /**
     * 商品上下架操作
     *
     * @param id       商品id
     * @param saleable 是否上下架： ture=上架，false=下架
     * @return 在修改spu的上下架状态时，无需修改sku的enable属性，sku的enable属性只与当前sku的库存量有关，如果库存大于0，就是有效，否则是无效。
     */
    @PutMapping("/spu/saleable")
    public ResponseEntity<Void> updateSaleable(
            @RequestParam("id") Long id,
            @RequestParam("saleable") Boolean saleable) {
        goodsService.updateSaleable(id, saleable);
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
    }

    /**
     * 根据Spuld查询Sku对象集合
     *
     * @param spuId
     * @return
     */
    @GetMapping("/sku/of/spu")
    public ResponseEntity<List<Sku>> findSkusBySpuId(@RequestParam("id") Long spuId) {
        List<Sku> skuList = goodsService.findSkusBySpuId(spuId);
        return ResponseEntity.ok(skuList);
    }

    /**
     * 根据SpuId查询SpuDetail对象
     *
     * @param id
     * @return
     */
    @GetMapping("/spu/detail")
    //公共响应实体<SpuDetail> 方法名(@请求参数("id") Long id)
    public ResponseEntity<SpuDetail> findSpuDetailById(@RequestParam("id") Long id) {
        // 创建对象,实体类 名字 = 商品服务类.对象(id);
        SpuDetail spuDetail = goodsService.findSpuDetailById(id);
        // 返回 响应实体类.ok(实体类的名字);
        return ResponseEntity.ok(spuDetail);
    }

    /**
     * 根据id去查询spu信息
     *
     * @param spuId
     * @return
     */
    @GetMapping("/spu/{id}")
    public ResponseEntity<SpuDTO> findSpuById(@PathVariable("id") Long spuId) {
        SpuDTO spuDTO = goodsService.findSpuById(spuId);
        return ResponseEntity.ok(spuDTO);
    }

    // TODO 2020.05.19 补 05.08的商品修改业务
    // 商品修改：修改商品回显数据

    /**
     * 根据SpuId查询SpuDetail对象
     *
     * @param id
     * @return
     */
    // @GetMapping("/spu/detail")
    // public ResponseEntity<SpuDetail> querySpuDetailSpuId(@RequestParam("id") Long id) {
    //     SpuDetail spuDetail = goodsService.querySpuDetailSpuId(id);
    //     return ResponseEntity.ok(spuDetail);
    // }

    /**
     * 根据Spuld查询Sku对象集合
     *
     * @param id
     * @return
     */
    // @GetMapping("/sku/of/spu")
    // public ResponseEntity<List<Sku>> querySkuListBySpuId(@RequestParam("id") Long id) {
    //     List<Sku> list = goodsService.querySkuListBySpuId(id);
    //     return ResponseEntity.ok(list);
    // }

    /**
     * 根据id批量查询sku
     *
     * @param ids skuId的集合
     * @return sku的集合
     */
    @GetMapping("/sku/list")
    public ResponseEntity<List<Sku>> findSkusByIds(@RequestParam("ids") List<Long> ids) {
        List<Sku> skuList = goodsService.findSkusByIds(ids);
        return ResponseEntity.ok(skuList);
    }

    /**
     * 修改商品
     *
     * @param spuDTO
     * @return
     */
    @PutMapping("/goods")
    public ResponseEntity<Void> updateGoods(@RequestBody SpuDTO spuDTO) {
        goodsService.updateGoods(spuDTO);
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
    }

    /**
     * 减去库存
     *
     * @param carts
     * @return
     */
    @PutMapping("/stock/minus")
    public ResponseEntity<Void> minusStock(@RequestBody Map<Long, Integer> carts) {
        goodsService.minusStock(carts);
        // return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
    }

}
